package cn.cheniy.swiftmark.common.feign;

import org.apache.http.client.config.RequestConfig;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 在使用 Feign 进行微服务之间的 HTTP 调用时，通过配置这样的 HttpClient 可以提高请求的性能和稳定性。
 * 例如，在高并发场景下，连接池可以复用已经建立的连接，减少连接建立和销毁的开销；合理设置超时时间可以避免长时间等待无效请求，提高系统的响应速度。
 * @author cheniy
 * @description Feign 微服务之间的 HTTP配置
 *
 */
@Configuration
public class FeignHttpClientConfig {

    @Bean (destroyMethod = "close")
    public CloseableHttpClient httpClient() {
        PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();
        connectionManager.setMaxTotal(400);
        connectionManager.setDefaultMaxPerRoute(100);

        RequestConfig requestConfig = RequestConfig.custom()
                //从连接池获取连接等待超时时间
                .setConnectionRequestTimeout(2000)
                //请求超时时间
                .setConnectTimeout(2000)
                //等待服务响应超时时间
                .setSocketTimeout(15000)
                .build();
        HttpClientBuilder httpClientBuilder = HttpClientBuilder.create().setConnectionManager(connectionManager)
                .setDefaultRequestConfig(requestConfig)
                .evictExpiredConnections();
        return httpClientBuilder.build();
    }
}
